

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;


import com.thoughtworks.xstream.XStream;


public class Directorio implements DirectorioInterfaz {
  
    /**
     * {@inheritDoc}
     * @throws Exception 
     */
    public Collection<ArticuloPreClasificado> buscarArticulosPreClasificados(String pathDirectorio) throws Exception{
        return buscarArticulos(pathDirectorio, new ArticuloPreClasificado());
    }
    
    /** 
     * {@inheritDoc}
     * @throws Exception 
     */
	public Collection<Articulo> buscarArticulos(String pathDirectorio) throws Exception{
		return buscarArticulos(pathDirectorio, new Articulo());
	}
    
    @SuppressWarnings("unchecked")
	public <T extends Articulo> Collection<T> buscarArticulos(String pathDirectorio, T t) throws Exception {
    	Collection<T> articulos = new ArrayList<T>();
        // si no es un directorio retornar error
        File dir = new File(pathDirectorio);
        if (!dir.isDirectory()) {
            throw new Exception("El path no corresponde a un directorio existente");
        }
        
        // recorrer todos los archivos y transformar el xml a un objeto
        File[] archivos = dir.listFiles(new XmlFileFilter());
        XStream xStream = new XStream();
        for (File archivoXml : archivos) {
            try {
                xStream.alias("articulo", ArticuloPreClasificado.class);
                T articulo;
                articulo= (T)xStream.fromXML(ArchivoUtil.readFileAsString(archivoXml));
                articulo.setArchivo(archivoXml.getAbsolutePath());
                articulos.add(articulo);
            } catch (IOException e) {
                System.out.print("Error al parsear un mail en xml");
            }
        }
        
        return articulos;
    }
    
    public void moverNoInteresantesACarpeta(Collection<ArticuloClasificado> articulos, String directorioNoInteresantes) throws IOException {    
		File directorio = new File(directorioNoInteresantes);				
		if (!directorio.exists()){
			directorio.mkdirs();
		}
		
		for (ArticuloClasificado articuloClasificado : articulos) {
			if (!articuloClasificado.isInteresante()){
				moverArticulo(articuloClasificado, directorioNoInteresantes);
			}
		}    	
    }
    
    private void moverArticulo(ArticuloClasificado articuloClasificado, String pathDirectorio) throws IOException{
    	XStream xStream = new XStream();
    	xStream.alias("articulo", ArticuloClasificado.class);
		String xml = xStream.toXML(articuloClasificado);			
		String nombreArchivo = articuloClasificado.getArchivo().substring(articuloClasificado.getArchivo().lastIndexOf("\\")+1);
		FileOutputStream file = new FileOutputStream(pathDirectorio+"/"+nombreArchivo);
		try{
			file.write(xml.getBytes());
		} finally {
			file.close();
		}
		
		File mailOriginal = new File(articuloClasificado.getArchivo());
		mailOriginal.delete();
    }

    /**
     * 
     * {@inheritDoc}
     */
	public void moverInteresantesACarpeta(Collection<ArticuloClasificado> articulos, String pathDirectorio) throws IOException {
		File directorio = new File(pathDirectorio);				
		if (!directorio.exists()){
			directorio.mkdirs();
		}
		
		for (ArticuloClasificado articuloClasificado : articulos) {
			if (articuloClasificado.isInteresante()){
				moverArticulo(articuloClasificado, pathDirectorio);
			}
		}		
	}    
}
